/* ---- CRC16 -------- */
#include "crc16.h"

/* -- typedef ------------ */

/* -- valiables ---------- */
	
/* -- functions ---------- */
void mK_cRctable(unsigned short gEnpoly,unsigned short *cRctable_16);


unsigned short Get_CRC16_CCITT(unsigned long nLength,unsigned char *pData)
//函数功能：计算数据流* pData的16位CRC校验码，数据流长度为nLength
{
    unsigned short cRc_16 = 0x0000;    // 初始化
	unsigned char *pdat = pData;
	unsigned short cRctable_16[256];

	//mK_cRctable(MULT_CRC16,cRctable_16);		// CRC16
	mK_cRctable(MULT_CRC16CCITT,cRctable_16);		// CRC16-CCITT

    while(nLength > 0)
    {
        cRc_16 = (cRc_16 << 8) ^ cRctable_16[((cRc_16>>8) ^ *(pdat++)) & 0xff]; //cRctable_16表由函数mK_cRctable生成
        nLength--;
        //pData++;
    } 
    return cRc_16;   

}
//函数功能：计算数据流* pData的16位CRC校验码，数据流长度为nLength
unsigned short Get_CRC16(unsigned long nLength,unsigned char *pData)
{
    unsigned short cRc_16 = 0x0000;    // 初始化
	unsigned char *pdat = pData;
	unsigned short cRctable_16[256];

	mK_cRctable(MULT_CRC16,cRctable_16);		    // 计算CRC16的表
	//mK_cRctable(MULT_CRC16CCITT,cRctable_16);		// 计算CRC16-CCITT

    while(nLength > 0)
    {
        cRc_16 = (cRc_16 << 8) ^ cRctable_16[((cRc_16>>8) ^ *(pdat++)) & 0xff]; //cRctable_16表由函数mK_cRctable生成
        nLength--;
        //pData++;
    } 
    return cRc_16;   

}

//函数功能：生成0－255对应的16CRC校验码，其实就是计算机算法1（比特型算法）
//gEnpoly为生成多项式
//注意，低位先传送时，生成多项式应反转(低位与高位互换)。如CRC16-CCITT为0x1021，反转后为0x8408
void mK_cRctable(unsigned short gEnpoly,unsigned short *cRctable_16)
{	
	unsigned short cRc_16=0;	
	unsigned short i,j,k;
	
	for(i=0,k=0;i<256;i++,k++)
	
	{	
		cRc_16 = i<<8;
		
		for(j=8;j>0;j--)		
		{			
			if(cRc_16&0x8000)                 //反转时cRc_16&0x0001			
				cRc_16=(cRc_16<<=1)^gEnpoly; //反转时cRc_16=(cRc_16>>=1)^gEnpoly			
			else			
				cRc_16<<=1;                   //反转时cRc_16>>=1
		}		
		cRctable_16[k] = cRc_16;	
	}
}

/*****************************************************
** @函数名：DectoBCD
** @描述  ：十进制转BCD码
** @参数  ：None
** @返回值：None
*****************************************************/
int DectoBCD(int Dec, unsigned char *Bcd)
{
     int i;
     int temp;
	
	   Dec  = Dec%100;
	   temp = Dec/10;
	   Dec  = Dec%10;
	   *Bcd = (temp << 4) | Dec;
     return 0;
}


